package com.keqiang.filepicker

import android.content.Context
import android.content.Intent
import android.os.Build
import androidx.annotation.IntRange

/**
 * 文件预览启动器
 *
 * @author Created by wanggaowan on 2022/5/22 00:42
 */
class FilePicker private constructor(private val context: Context) {
    private val intent: Intent = Intent(context, FilePickerActivity::class.java).apply {
        putExtra(FilePickerActivity.MAX_CHOOSE_COUNT, 1)
    }

    /**
     * 文件最多可选择数量
     */
    fun maxChosenCount(@IntRange(from = 0) maxCount: Int): FilePicker {
        intent.putExtra(FilePickerActivity.MAX_CHOOSE_COUNT, if (maxCount < 0) 0 else maxCount)
        return this
    }

    /**
     * 可选择文件的MIME类型，如:text/plain,image/jpeg等。如果未指定文件mime且也未指定[fileExtension],[excludeFileMime],[excludeFileExtension],则可选择所有类型文件。
     * 建议调用[fileExtension]来指定可选择文件类型，因为指定MIME类型时，在查询特定类型文件时，可能查询不全，比如查找所有文档，所有ZIP等
     */
    fun fileMime(vararg mime: String): FilePicker {
        intent.putExtra(FilePickerActivity.CHOSEN_FILE_MIME, mime)
        return this
    }

    /**
     * 排除的文件的MIME类型，如:text/plain,image/jpeg等。如果未指定排除的文件mime且也未指定[fileExtension],[fileMime],[excludeFileExtension]则可选择所有类型文件。
     * 建议调用[excludeFileExtension]来指定排除文件类型，因为指定MIME类型时，在查询特定类型文件时，可能查询不全，比如查找所有文档，所有ZIP等
     */
    fun excludeFileMime(vararg mime: String): FilePicker {
        intent.putExtra(FilePickerActivity.EXCLUDE_FILE_MIME, mime)
        return this
    }

    /**
     * 可选择文件的扩展名，如:txt，pdf等。如果未指定文件扩展名且也未指定[fileMime],[excludeFileMime],[excludeFileExtension],则可选择所有类型文件
     */
    fun fileExtension(vararg extension: String): FilePicker {
        intent.putExtra(FilePickerActivity.CHOSEN_FILE_EXTENSION, extension)
        return this
    }

    /**
     * 排除的文件扩展名，如:txt，pdf等。如果未指定排除文件扩展名且也未指定[fileMime],[fileExtension],[excludeFileMime]则可选择所有类型文件
     */
    fun excludeFileExtension(vararg extension: String): FilePicker {
        intent.putExtra(FilePickerActivity.EXCLUDE_FILE_EXTENSION, extension)
        return this
    }

    /**
     * 默认打开的路径，具体可参考[DefaultOpenPath]
     */
    fun defaultOpenPath(@DefaultOpenPath path: String): FilePicker {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
            if (path == DefaultOpenPath.DOCUMENT_PATH
                || path == DefaultOpenPath.DOWNLOAD_PATH
                || path == DefaultOpenPath.LATELY_PATH
                || path == DefaultOpenPath.ZIP_PATH) {
                return this
            }
        }

        intent.putExtra(FilePickerActivity.DEFAULT_OPEN_PATH, path)
        return this
    }

    /**
     * 如果以网格模式展示，展示成几列。主要用于横屏设备
     */
    fun spanCount(@IntRange(from = 2) spanCount: Int): FilePicker {
        intent.putExtra(FilePickerActivity.SPAN_COUNT, if (spanCount < 2) 2 else spanCount)
        return this
    }

    /**
     * 首选展示布局，具体可参考[PreferredLayout]。如果传null，则自动根据打开的路径选择不同的展示布局
     */
    fun preferredLayout(@PreferredLayout layout: String?): FilePicker {
        intent.putExtra(FilePickerActivity.PREFERRED_LAYOUT, layout)
        return this
    }

    /**
     * 限制文件最大大小，超出则不可选择，[maxFileSize] <= 0则无限制
     */
    fun maxFileSize(maxFileSize: Long): FilePicker {
        intent.putExtra(FilePickerActivity.MAX_FILE_SIZE, maxFileSize)
        return this
    }

    /**
     * 是否显示菜单按钮,展示则可切换其它分类选择文件，否则只能在默认分类或[defaultOpenPath]指定分类下选择文件
     */
    fun showMenu(showMenu: Boolean): FilePicker {
        intent.putExtra(FilePickerActivity.SHOW_MENU, showMenu)
        return this
    }

    /**
     * 启动文件选择，[callback]接口用户选中的数据
     */
    fun start(callback: FileChosenCallback) {
        FilePickerActivityWrapper.start(context, intent, callback)
    }

    companion object {
        /**
         * 创建文件选择器
         */
        @JvmStatic
        fun with(context: Context): FilePicker {
            return FilePicker(context)
        }

        @JvmStatic
        var stringRes: StringRes = ZhStringRes()
    }
}
